package com.kaifamiao.demo;

import com.kaifamiao.model.DataSourceInfo;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.List;

/**
 * @author lucien-ma
 * @date 2021/10/13
 * @apiNote
 */
public class Demo01 {
    public static void main(String[] args) {
        // 获取要解析 xml 的 inputStream 对象
        InputStream inputStream = Demo01.class.getClassLoader().getResourceAsStream("com/kaifamiao/demo/dataSourceInfo.xml");
        try {
            DataSourceInfo dataSourceInfo = parseDataSourceInfo(inputStream);
            System.out.println(dataSourceInfo);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static DataSourceInfo parseDataSourceInfo(InputStream inputStream) throws Exception {
        // 创建 SAXReader 对象
        SAXReader saxReader = new SAXReader();
        // 获取要解析 xml 文件的 document 对象
        Document document = saxReader.read(inputStream);
        // 获取根节点
        Element rootElement = document.getRootElement();
        // 获取根节点下的所有 property 标签
        List<Element> properties = rootElement.elements("property");
        // 创建 DataSource 对象
        DataSourceInfo dataSourceInfo = new DataSourceInfo();
        // 获取 Class 对象
        Class clazz = dataSourceInfo.getClass();
        for (Element property : properties) {
            String name = property.attributeValue("name");
            String value = property.attributeValue("value");
            // 解析出方法名
            String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
            // 通过反射获取 Method 对象
            Method method = clazz.getDeclaredMethod(methodName, String.class);
            //执行方法
            method.invoke(dataSourceInfo, value);
        }
        // 返回对象
        return dataSourceInfo;
    }
}
